/**
 * ZHU framework. Copyright 2012-, all rights reserved.
 *
 * $Id: Staff.java 47 2012-09-20 06:31:35Z zhuxiaopeng $
 * $Revision: 47 $
 * $Date: 2012-09-20 14:31:35 +0800 (四, 2012-09-20) $
 * $Author: zhuxiaopeng $
 */
package daily.entity;

import javax.persistence.*;
import javax.persistence.Entity;
import javax.persistence.Table;

import zhu.framework.entity.*;

import com.google.common.collect.*;

/**
 * <p>
 * </p>
 * 
 * @author $Author: zhuxiaopeng $
 * @version $Revision: 47 $ - $Date: 2012-09-20 14:31:35 +0800 (四, 2012-09-20) $
 */
@Entity
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "user_name" }) })
public class Staff extends AbstractEntityWithLongId implements Comparable<Staff> {

	/**
	 * <h3>スレッドセーフ性</h3>
	 * <p>
	 * この変数は<code>this</code>によってGuardされる。 この変数は<code>final</code>
	 * であり、参照先がスレッドセーフであるため、スレッドセーフ性を破ることはない。
	 * この変数の参照先はスレッドセーフ<strong>ではない</strong>。
	 * </p>
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * <p>
	 * プロパティ<code>userName</code>の値を取得する。
	 * </p>
	 * 
	 * @return プロパティ<code>userName</code>の値
	 */
	public String getUserName() {
		return userName;
	}

	/**
	 * <p>
	 * プロパティ<code>userName</code>の値を設定する。
	 * </p>
	 * 
	 * @param userName
	 *            プロパティ<code>userName</code>に設定する値
	 */
	public void setUserName(final String userName) {
		this.userName = userName;
	}

	/**
	 * <p>
	 * プロパティ<code>password</code>の値を取得する。
	 * </p>
	 * 
	 * @return プロパティ<code>password</code>の値
	 */
	public String getPassword() {
		return password;
	}

	/**
	 * <p>
	 * プロパティ<code>password</code>の値を設定する。
	 * </p>
	 * 
	 * @param password
	 *            プロパティ<code>password</code>に設定する値
	 */
	public void setPassword(final String password) {
		this.password = password;
	}

	/**
	 * <p>
	 * プロパティ<code>formalName</code>の値を取得する。
	 * </p>
	 * 
	 * @return プロパティ<code>formalName</code>の値
	 */
	public String getFormalName() {
		return formalName;
	}

	/**
	 * <p>
	 * プロパティ<code>formalName</code>の値を設定する。
	 * </p>
	 * 
	 * @param formalName
	 *            プロパティ<code>formalName</code>に設定する値
	 */
	public void setFormalName(final String formalName) {
		this.formalName = formalName;
	}

	/**
	 * <p>
	 * プロパティ<code>used</code>の値を取得する。
	 * </p>
	 * 
	 * @return プロパティ<code>used</code>の値
	 */
	public boolean isUsed() {
		return used;
	}

	/**
	 * <p>
	 * プロパティ<code>used</code>の値を設定する。
	 * </p>
	 * 
	 * @param used
	 *            プロパティ<code>used</code>に設定する値
	 */
	public void setUsed(final boolean used) {
		this.used = used;
	}

	/**
	 * <p>
	 * プロパティ<code>staffGroup</code>の値を取得する。
	 * </p>
	 * 
	 * @return プロパティ<code>staffGroup</code>の値
	 */
	public StaffType getStaffGroup() {
		return staffType;
	}

	/**
	 * <p>
	 * プロパティ<code>staffGroup</code>の値を設定する。
	 * </p>
	 * 
	 * @param staffType
	 *            プロパティ<code>staffGroup</code>に設定する値
	 */
	public void setStaffGroup(final StaffType staffType) {
		this.staffType = staffType;
	}

	/**
	 * <p>
	 * プロパティ<code>index</code>の値を取得する。
	 * </p>
	 * 
	 * @return プロパティ<code>index</code>の値
	 */
	public Integer getIndex() {
		return index;
	}

	/**
	 * <p>
	 * プロパティ<code>index</code>の値を設定する。
	 * </p>
	 * 
	 * @param index
	 *            プロパティ<code>index</code>に設定する値
	 */
	public void setIndex(final Integer index) {
		this.index = index;
	}

	/**
	 * <p>
	 * プロパティ<code>name</code>の値を取得する。
	 * </p>
	 * 
	 * @return プロパティ<code>name</code>の値
	 */
	public String getName() {
		return name;
	}

	/**
	 * <p>
	 * プロパティ<code>name</code>の値を設定する。
	 * </p>
	 * 
	 * @param name
	 *            プロパティ<code>name</code>に設定する値
	 */
	public void setName(final String name) {
		this.name = name;
	}

	@Override
	public int compareTo(final Staff o) {
		return ComparisonChain.start().compare(index, o.getIndex(), Ordering.natural().nullsLast()).result();
	}

	@Column(name = "user_name", nullable = false)
	private String userName;

	@Column(name = "pass_word", nullable = false)
	private String password;

	@Column(name = "formal_name", nullable = false)
	private String formalName;

	private boolean used;

	@Enumerated(EnumType.STRING)
	private StaffType staffType;

	private Integer index;

	@Column(nullable = false)
	private String name;
}
